#include<iostream>
#include<string>
#include<cstdio>
#include<errno.h>
#include<string.h>
#include<cstdlib>
#include<unistd.h>
#include<sys/wait.h>

using namespace std;

//void fun(){
//  cout<<"hello whz"<<endl;
//  //exit(100);
//  _exit(23);
//}


int main()
{



  pid_t id = fork();
  
  if(id<0)
  {
    printf("errno:%d,errorstring: %s\n",errno,strerror(errno));
    return errno;
  }
  else if(id==0)
  {
      int cnt=5;
      while(true)
      {
        printf("子进程正在运行中,pid:%d\n",getpid());
        sleep(1);
        cnt--;
      }
      //我们可不可以使用全局变量，来获取子进程的退出码呢？
      exit(123);
  }
  else
  {
      sleep(10);
      int status = 0;
      //此时id就是父进程拿到子进程的id
      //为什么我们只能通过系统调用获取子进程退出码
      pid_t rid=waitpid(id,&status,0);
      if(rid>0)
      {
        printf("wait sub process success,rid: %d\n,status: %d\n,exit signal: %d\n",rid,(status>>8)&0xFF,status&0x7F);
      }
      else 
      {
        perror("waitpid");
      }
      printf("我是父进程，我的pid:%d\n",getpid());
      sleep(1);
    
  }
  
//
  //printf("进程运行结束");
  //sleep(2);
  //_exit(5);

  //sleep(2);
  //
  //for(int i=0;i<200;i++)
  //{
  //  cout<<"code:"<<i<<",errstring: "<<strerror(i)<<endl;
  //}
  //printf("before: errno: %d,errstring: %s\n",errno,strerror(errno));
  //FILE *fp=fopen("./log.txt","r");
  //if(fp==nullptr){
  //  printf("errno: %d,errstring: %s\n",errno,strerror(errno));
  //  return errno;
  //}

  return 0;
}
